//
// Created by LiuYou on 2021/5/9.
//

#include <cstdio>
#include <cstdlib>
#include <unistd.h>
#include <ctime>


int main(int argc, char** argv) {
    const char* const fileName = "/tmp/out";
    FILE* fp = std::fopen(fileName, "a+");
    if (fp == nullptr) {
        std::perror("fopen()");
        std::exit(1);
    }

    const int BUF_SIZE = 1024;
    char buf[BUF_SIZE]{};
    int count{};
    // todo 疑问: 这里在循环读什么?
    for (;;) {
        // 读
        if (std::fgets(buf, BUF_SIZE, fp) != nullptr) {
            ++count;
        } else {
            break;
        }
    }
    time_t timeStamp{};
    tm* tp = nullptr;

    // TODO 注意: 程序执行到这里之后会进入一个死循环。
    //  那么, 这个程序如何结束呢?
    //  比如: 在终端上发信号、使用ctrl + c将这个进程杀死。但是这两种方式并不合适。
    //  比较好的方案: 用钩子函数等等这样的机制, 比如当前这个程序可以被信号杀死, 那么
    //  就可以使用一些信号处理函数。
    //  这里在此就想让它一直循环着吧, 想退出了直接ctrl + c终止进程。
    for (;;) {
        // 写
        time(&timeStamp);
        tp = localtime(&timeStamp);
        // TODO 注意: 这里要注意: 除了标准的终端设备, 其它的流默认是全缓冲形式。
        //  所以, 这里std::fprintf()函数中的 '\n' 已经不能起到一个刷新缓冲区的作用了。
        std::fprintf(fp, "%-4d%d-%d-%d %d:%d:%d\n", ++count, \
                     // 因为是从1900年开始计的年份。
                     tp->tm_year + 1900, \
                     // 因为是从 0 ~ 11 表示的 12个月份。
                     tp->tm_mon + 1, \
                     tp->tm_mday, \
                     tp->tm_hour, \
                     tp->tm_min, \
                     tp->tm_sec);
        // TODO 注意: 所以, 我们可以使用std::fflush()将流刷新一下。
        std::fflush(fp);

        sleep(1);
    }


    std::fclose(fp);

    return 0;
}